﻿function recalcularTotal() {
    var total = 0;
    if (!Ext.isEmpty(Ext.StoreMgr.get('storePresupuestoDetalle'))) {
        Ext.StoreMgr.get('storePresupuestoDetalle').each(function (det) {
            total += Ext.util.Format.number(det.get('precio'), '0.00') * det.get('cantidad');
        });
    }
    if (!Ext.isEmpty(Ext.StoreMgr.get('storePresupuestoCosto'))) {
        Ext.StoreMgr.get('storePresupuestoCosto').each(function (cos) {
            var costo = Ext.StoreMgr.get('storeCosto').getById(cos.get('id_costo'));
            if (Ext.isEmpty(costo.get('valor'))) {
                total = eval(total + costo.get('signo') + '(' + total * costo.get('porcentaje') + '/100)');
            }
            else {
                total = eval(total + costo.get('signo') + costo.get('valor'));
            }
        });
    }
    Ext.getCmp('tfTotal').setValue(Ext.util.Format.number(total, '0.00'));
}

Ext.define('Presupuesto', {
    extend: 'ABMBase',
    Title: 'Formulario ABM Presupuesto',
    Model: 'Model.Presupuesto',
    defaultPropertySort: 'fecha',
    storePresupuestoDetalle: CreateForeignStore('storePresupuestoDetalle', 'Model.PresupuestoDetalle'),
    storePresupuestoCosto: CreateForeignStore('storePresupuestoCosto', 'Model.PresupuestoCosto'),
    storeArticulos: CreateForeignStore('storeArticulos', 'Model.Articulos'),
    storeCosto: CreateForeignStore('storeCosto', 'Model.Costo'),
    storeEntidad: CreateForeignStore('storeEntidad', 'Model.Entidad'),
    identityItem: 1,
    listeners: {
        Creando: function (rcd) {
            rcd.record.set('id_presup', activeInstance.GetNum('PRESU'));
            rcd.record.set('fecha', new Date());
            rcd.record.set('id_entidad', activeInstance.EjecutarEnServidor('ObtenerEntidadOperador'));
            Ext.StoreMgr.get('storePresupuestoDetalle').reload({
                params: { filter: '[{ "type": "numeric", "comparison": "eq", "value": -1, "field": "id_presup"}]' }
            });
            Ext.StoreMgr.get('storePresupuestoCosto').reload({
                params: { filter: '[{ "type": "numeric", "comparison": "eq", "value": -1, "field": "id_presup"}]' }
            });
            activeInstance.identityItem = 1;
        },
        Editando: function (rcd) {
            Ext.StoreMgr.get('storePresupuestoDetalle').reload({
                params: { filter: '[{ "type": "numeric", "comparison": "eq", "value": ' + rcd.record.get('id_presup') + ', "field": "id_presup"}]' },
                callback: function () {
                    activeInstance.identityItem = Ext.StoreMgr.get('storePresupuestoDetalle').max('item');
                }
            });
            Ext.StoreMgr.get('storePresupuestoCosto').reload({
                params: { filter: '[{ "type": "numeric", "comparison": "eq", "value": ' + rcd.record.get('id_presup') + ', "field": "id_presup"}]' }
            });
        },
        Actualizado: function (rcd, success) {
            if (success) {
                Ext.StoreMgr.get('storePresupuestoDetalle').sync();
                Ext.StoreMgr.get('storePresupuestoCosto').sync(); ;
            }
        }
    },
    WindowPanel: [{
        xtype: 'fieldset',
        title: 'Cabecera',
        collapsible: true,
        items: [{
            xtype: 'container',
            frame: true,
            layout: 'column',
            items: [{
                xtype: 'fieldset',
                columnWidth: 0.5,
                border: false,
                items: [{
                    xtype: 'textfield',
                    id: 'tfIdPresupuesto',
                    fieldLabel: 'Identificador',
                    name: 'id_presup',
                    maxLength: 10,
                    enforceMaxLength: true,
                    allowBlank: false
                }, {
                    xtype: 'datefield',
                    fieldLabel: 'Fecha de Alta',
                    name: 'fecha',
                    allowBlank: false,
                    readOnly: true
                }, {
                    xtype: 'combobox',
                    fieldLabel: 'Comercio',
                    queryMode: 'local',
                    displayField: 'nombre',
                    valueField: 'id_entidad',
                    editable: true,
                    forceSelection: true,
                    store: Ext.StoreMgr.get('storeEntidad'),
                    readOnly: true,
                    allowBlank: false,
                    name: 'id_entidad'
                }]
            }, {
                xtype: 'fieldset',
                columnWidth: 0.5,
                border: false,
                items: [{
                    xtype: 'datefield',
                    fieldLabel: 'Fecha de Entrega',
                    name: 'fecha_entrega',
                    allowBlank: false
                }, {
                    xtype: 'datefield',
                    fieldLabel: 'Fecha de Pago',
                    name: 'fecha_pago',
                    allowBlank: false
                }, {
                    xtype: 'textfield',
                    id: 'tfTotal',
                    fieldLabel: 'Total',
                    name: 'total',
                    readOnly: true
                }]
            }]
        }]
    }, {
        xtype: 'fieldset',
        title: 'Detalle',
        collapsible: true,
        collapsed: true,
        items: [{
            xtype: 'grid',
            height: 200,
            store: Ext.StoreMgr.get('storePresupuestoDetalle'),
            tbar: [{
                xtype: 'combobox',
                queryMode: 'local',
                displayField: 'descripcion',
                valueField: 'id_articulo',
                editable: true,
                forceSelection: true,
                store: Ext.StoreMgr.get('storeArticulos'),
                listeners: {
                    select: function (cbo, rcd, eOpt) {
                        if (Ext.isEmpty(Ext.StoreMgr.get('storePresupuestoDetalle').getById(rcd[0].get('id_articulo')))) {
                            var model = Ext.ModelManager.getModel('Model.PresupuestoDetalle');
                            var record = new model();
                            record.set('item', activeInstance.identityItem++);
                            record.set('id_presup', Ext.getCmp('tfIdPresupuesto').getValue());
                            record.set('id_articulo', rcd[0].get('id_articulo'));
                            record.set('descripcion', rcd[0].get('descripcion'));
                            record.set('precio', rcd[0].get('precio'));
                            Ext.StoreMgr.get('storePresupuestoDetalle').add(record);

                            recalcularTotal();
                        }
                    }
                }
            }],
            listeners: {
                edit: function () {
                    recalcularTotal();
                    if (Ext.getCmp('mainGrid').getSelectionModel().getSelection().length > 0)
                        Ext.getCmp('mainGrid').getSelectionModel().getSelection()[0].setDirty();
                }
            },
            plugins: [Ext.create('Ext.grid.plugin.CellEditing', {
                clicksToEdit: 1
            })],
            columns: [
                { header: 'Item', dataIndex: 'item', width: 40 },
                { header: 'Descripcion', dataIndex: 'descripcion', flex: 1 },
                { header: 'Precio', dataIndex: 'precio', xtype: 'numbercolumn', format: '0.00', width: 60 },
                 { header: 'Cantidad', dataIndex: 'cantidad', xtype: 'numbercolumn', format: '0', width: 60, editor: {
                     xtype: 'numberfield',
                     name: 'cantidad',
                     maxValue: 99,
                     minValue: 0,
                     allowBlank: false
                 }
                 },
                { header: 'Precio Total', dataIndex: 'precioTotal', xtype: 'numbercolumn', format: '0.00', width: 80, renderer: function (value, mData, record) { return Ext.util.Format.number(Ext.util.Format.number(record.get('precio'), '0.00') * record.get('cantidad'), '0.00'); } },
                {
                    xtype: 'actioncolumn',
                    width: 50,
                    menuDisabled: true,
                    items: [{
                        iconCls: 'boton-Borrar',
                        tooltip: 'Borrar',
                        handler: function (grid, rowIndex, colIndex) {
                            Ext.StoreMgr.get('storePresupuestoDetalle').remove(Ext.StoreMgr.get('storePresupuestoDetalle').getAt(rowIndex));
                            recalcularTotal();
                        }
                    }]
                }
                        ]
        }]
    }, {
        xtype: 'fieldset',
        title: 'Costo',
        collapsible: true,
        collapsed: true,
        items: [{
            xtype: 'grid',
            height: 200,
            store: Ext.StoreMgr.get('storePresupuestoCosto'),
            tbar: [{
                xtype: 'combobox',
                queryMode: 'local',
                displayField: 'descripcion',
                valueField: 'id_costo',
                editable: true,
                forceSelection: true,
                store: Ext.StoreMgr.get('storeCosto'),
                listeners: {
                    select: function (cbo, rcd, eOpt) {
                        if (Ext.isEmpty(Ext.StoreMgr.get('storePresupuestoCosto').getById(rcd[0].get('id_costo')))) {
                            var model = Ext.ModelManager.getModel('Model.PresupuestoCosto');
                            var record = new model();
                            record.set('id_presup', Ext.getCmp('tfIdPresupuesto').getValue());
                            record.set('id_costo', rcd[0].get('id_costo'));
                            record.set('importe', Ext.isEmpty(rcd[0].get('valor')) ? rcd[0].get('porcentaje') : rcd[0].get('valor'));
                            Ext.StoreMgr.get('storePresupuestoCosto').add(record);

                            recalcularTotal();
                        }
                    }
                }
            }],
            listeners: {
                edit: function () {
                    if (Ext.getCmp('mainGrid').getSelectionModel().getSelection().length > 0)
                        Ext.getCmp('mainGrid').getSelectionModel().getSelection()[0].setDirty();
                }
            },
            columns: [
                            { header: 'Costo', dataIndex: 'id_costo', flex: 1, renderer: ForeignStoreRenderer('storeCosto', 'descripcion') },
                            { header: 'Importe', dataIndex: 'importe', xtype: 'numbercolumn', format: '0.00',
                                renderer: function (value, metaData, record, rowIndex, colIndex, store, view) {
                                    var costo = Ext.StoreMgr.get('storeCosto').getById(record.get('id_costo'));
                                    if (Ext.isEmpty(costo.get('valor'))) {
                                        return costo.get('signo') + ' ' + costo.get('porcentaje') + '%';
                                    }
                                    else {
                                        return costo.get('signo') + ' ' + costo.get('valor');
                                    }
                                }
                            }, {
                                xtype: 'actioncolumn',
                                width: 50,
                                menuDisabled: true,
                                items: [{
                                    iconCls: 'boton-Borrar',
                                    tooltip: 'Borrar',
                                    handler: function (grid, rowIndex, colIndex) {
                                        Ext.StoreMgr.get('storePresupuestoCosto').remove(Ext.StoreMgr.get('storePresupuestoCosto').getAt(rowIndex));
                                        recalcularTotal();
                                    }
                                }]
                            }
                        ]
        }]
    }, {
        xtype: 'fieldset',
        title: 'Observaciones',
        collapsible: true,
        layout: 'fit',
        items: [{
            xtype: 'textarea',
            hideLabel: true,
            name: 'observaciones'
        }]
    }],
    Columns: [
            { text: 'Identificador', dataIndex: 'id_presup', filter: true },
            { xtype: 'datecolumn', text: 'Fecha', dataIndex: 'fecha', filter: true },
            { xtype: 'datecolumn', text: 'Fecha Entrega', dataIndex: 'fecha_entrega', filter: true },
            { xtype: 'datecolumn', text: 'Fecha Pago', dataIndex: 'fecha_pago', filter: true },
            { text: 'Total', dataIndex: 'total', filter: true, xtype: 'numbercolumn', format: '0.00' },
            { text: 'Observaciones', dataIndex: 'observaciones', filter: true }
        ]
});
